package com.atguigu.util;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * 单例模式：双检查锁DCL
 * @author 伟哥
 * @date 2021-06-21 15:01
 */
public class JedisPoolUtil {
    // 将自身需要实例化的对象，设置为属性，并用static、volatile
    private volatile static JedisPool jedisPool = null;

    // 构造器私有化
    private JedisPoolUtil(){}

    /**
     * 获取 线程池
     * @return
     */
    public static JedisPool getJedisPoolInstance(){
        // 第一次检查，实例是否，已经被多线程实例化
        if (jedisPool == null){
            // 加锁
            synchronized (JedisPoolUtil.class){
                // 如果某个线程取得了类锁，实例化对象前第二次检查 jedisPool 是否已经被实例化
                if (jedisPool == null){

                    // 初始化连接池，配置
                    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
                    // 最大连接数
                    poolConfig.setMaxTotal(1000);
                    // 最大空闲连接
                    poolConfig.setMaxIdle(32);
                    // 最大等待时间
                    poolConfig.setMaxWaitMillis(100 * 1000);
                    // 检查连通性
                    poolConfig.setTestOnBorrow(true);

                    jedisPool = new JedisPool(poolConfig,"192.168.2.5",6379);
                }
            }
        }
        return jedisPool;
    }

    /**
     * 归还连接
     * @param jedisPool
     * @param jedis
     */
    public static void release(JedisPool jedisPool, Jedis jedis){
        if (jedis != null){
            jedisPool.returnResource(jedis);
        }
    }
}
